home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 020 / arcsourc.arc / ARCCVT.MAC < prev    next >
Encoding:
Text File  |  1985-11-09  |  4.5 KB  |  110 lines

  1. /*  ARC - Archive utility - ARCCVT
  2.  
  3. $define(tag,$$segment(@1,$$index(@1,=)+1))#
  4. $define(version,Version $tag(
  5. TED_VERSION DB =1.12), created on $tag(
  6. TED_DATE DB =11/09/85) at $tag(
  7. TED_TIME DB =21:57:55))#
  8. $undefine(tag)#
  9.     $version
  10.  
  11. (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
  12.  
  13.     By:  Thom Henderson
  14.  
  15.     Description:
  16.          This file contains the routines used to convert archives to use
  17.          newer file storage methods.
  18.  
  19.     Language:
  20.          Computer Innovations Optimizing C86
  21. */
  22. #include <stdio.h>
  23. #include "arc.h"
  24.  
  25. static char tempname[$strlen];         /* temp file name */
  26.  
  27. cvtarc(num,arg)                        /* convert archive */
  28. int num;                               /* number of arguments */
  29. char *arg[];                           /* pointers to arguments */
  30. {
  31.     struct heads hdr;                  /* file header */
  32.     int cvt;                           /* true to convert current file */
  33.     int did[$maxarg];                  /* true when argument was used */
  34.     int n;                             /* index */
  35.     char *makefnam();                  /* filename fixer */
  36.     FILE *fopen();                     /* file opener */
  37.  
  38.     if(arctemp)                   /* use temp area if specified */
  39.          sprintf(tempname,"%s$ARCTEMP.CVT",arctemp);
  40.     else makefnam("$ARCTEMP.CVT",arcname,tempname);
  41.  
  42.     if(warn)
  43.          if(fopen(tempname,"rb"))
  44.               abort("Temporary file %s already exists",tempname);
  45.  
  46.     openarc(1);                        /* open archive for changes */
  47.  
  48.     for(n=0; n<num; n++)               /* for each argument */
  49.          did[n] = 0;                   /* reset usage flag */
  50.  
  51.     if(num)                            /* if files were named */
  52.     {    while(readhdr(&hdr,arc))      /* while more files to check */
  53.          {    cvt = 0;                 /* reset convert flag */
  54.               for(n=0; n<num; n++)     /* for each template given */
  55.               {    if(match(hdr.name,arg[n]))
  56.                    {    cvt = 1;       /* turn on convert flag */
  57.                         did[n] = 1;    /* turn on usage flag */
  58.                         break;         /* stop looking */
  59.                    }
  60.               }
  61.  
  62.               if(cvt)                  /* if converting this one */
  63.                    cvtfile(&hdr);      /* then do it */
  64.               else                     /* else just copy it */
  65.               {    writehdr(&hdr,new);
  66.                    filecopy(arc,new,hdr.size);
  67.               }
  68.          }
  69.     }
  70.  
  71.     else while(readhdr(&hdr,arc))      /* else convert all files */
  72.          cvtfile(&hdr);
  73.  
  74.     hdrver = 0;                        /* archive EOF type */
  75.     writehdr(&hdr,new);                /* write out our end marker */
  76.     closearc(1);                       /* close archive after changes */
  77.  
  78.     if(note)
  79.          for(n=0; n<num; n++)          /* report unused args */
  80.               if(!did[n])
  81.                    printf("File not found: %s\n",arg[n]);
  82. }
  83.  
  84. static cvtfile(hdr)                    /* convert a file */
  85. struct heads *hdr;                     /* pointer to header data */
  86. {
  87.     long starts, ftell();              /* where the file goes */
  88.     FILE *tmp, *fopen();               /* temporary file */
  89.  
  90.     if(!(tmp=fopen(tempname,"wrb")))
  91.          abort("Unable to create temporary file %s",tempname);
  92.  
  93.     if(note)
  94.          printf("Converting file: %-12s   reading, ",hdr->name);
  95.  
  96.     unpack(arc,tmp,hdr);               /* unpack the entry */
  97.     fseek(tmp,0L,0);                   /* reset temp for reading */
  98.  
  99.     starts = ftell(new);               /* note where header goes */
  100.     hdrver = $arcver;                  /* anything but end marker */
  101.     writehdr(hdr,new);                 /* write out header skeleton */
  102.     pack(tmp,new,hdr);                 /* pack file into archive */
  103.     fseek(new,starts,0);               /* move back to header skeleton */
  104.     writehdr(hdr,new);                 /* write out real header */
  105.     fseek(new,hdr->size,1);            /* skip over data to next header */
  106.     fclose(tmp);                       /* all done with the file */
  107.     if(unlink(tempname) && warn)
  108.          printf("Cannot unsave %s\n",tempname);
  109. }
  110.